from django.shortcuts import render

# Create your views here.
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework.views import APIView

from order.models import OrderInfo
from pay.models import Payment

"""
沙箱环境接口联调
在沙箱支持产品列表中的所有产品接口均已开通权限，开发者只需配置以下信息即可联调接口：

1. 沙箱appid
2. 沙箱网关
我们需要组织2套公钥和私钥
    一套是支付宝的,另外一个是我们自己应用程序的
    3. 沙箱应用私钥(我们自己的)
        私钥:放在我们的程序中
        公钥:放在支付宝的网站上
    4. 沙箱支付宝公钥(支付宝)
         私钥:放在支付宝的服务器上
         公钥:放在支付宝的网站上,我们需要拷贝下来,放在我们的程序中

"""

"""
当登陆用户点击去支付的时候,需要让前端将订单id传递给后端

1.后端接收订单id
2.根据订单id进行订单信息的查询
3.创建支付宝实例对象
4.生成order_string
5.拼接支付的url

get   /orders/(?P<order_id>\d+)/payment/

"""
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
class PaymentAPIView(APIView):

    permission_classes = [IsAuthenticated]

    def get(self,request,order_id):
        # 1.后端接收订单id
        # 2.根据订单id进行订单信息的查询
        try:
            # 这么查询订单是没问题的,
            # 但是 我们的需求是: 应该查询这个人的未支付订单
            # 为了确保查询的更准确,我们需要添加几个查询条件
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 3.创建支付宝实例对象
        from alipay import AliPay
        from meiduo_mall import settings
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()


        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug = settings.ALIPAY_DEBUG  # 默认False
        )
        subject = '测试订单'
        # 4.生成order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount), # 货比类型要转换为str order.total_amount
            subject=subject,
            return_url="http://www.meiduo.site:8080/pay_success.html"
        )

        # 5.拼接支付的url
        alipay_url = settings.ALIPAY_URL + '?' +order_string

        return Response({'alipay_url':alipay_url})


class PayStatuAPIView(APIView):

    def put(self,request):
        # 1.接收查询字符串参数
        data = request.query_params.dict()
        # 2.根据支付宝文档进行数据的验证
        # sign 不能参与签名验证
        signature = data.pop("sign")
        # verify
        from alipay import AliPay
        from meiduo_mall import settings
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        success = alipay.verify(data, signature)
        if success:
            # 3. 如果验证成功则获取 支付宝流水号和订单id
            """
            trade_no	String	必填	64	支付宝交易号	2013112011001004330000121536
            out_trade_no	String	必填	64	商户订单号	6823789339978248
            """
            trade_no = data.get('trade_no')
            out_trade_no=data.get('out_trade_no')
            # 4.  将支付宝流水号和订单id 保存起来
            Payment.objects.create(
                order_id=out_trade_no,
                trade_id=trade_no
            )
            # 5. 更新订单状态
            OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])

            return Response({'trade_id':trade_no})
